home *** CD-ROM | disk | FTP | other *** search
/ Aminet 6 / Aminet 6 - June 1995.iso / Aminet / util / cli / diff10.lha / Diff.e < prev    next >
Encoding:
Text File  |  1995-04-14  |  2.7 KB  |  96 lines

  1. /* (Amiga E source code)
  2.    Diff.e    : a utility to compare files, written in Amiga E
  3.    Author    : Email: eravau@is2.bfu.vub.ac.be (RAVAU Erwin)
  4.                WWW-Page: http://dinf.vub.ac.be/~eravau
  5.    USAGE     : Diff <file1> <file2>
  6.                Needs kick 2.0+
  7. */
  8.  
  9. OPT OSVERSION=37
  10.  
  11. ENUM ER_NONE,ER_FILE1,ER_FILE2,ER_MEM,ER_SYNTAX
  12.  
  13. DEF myargs:PTR TO LONG,rdargs,flen1,flen2,handle1=NIL,handle2=NIL,
  14.     buf1=NIL,buf2=NIL,result,perc,min,i
  15.  
  16. PROC main()
  17.    i:='$VER: Diff 1.0 (14.04.94)'
  18.    myargs:=[0,0,0,0]
  19.    WriteF('Diff v1.0 by Erwin Ravau.\n')
  20.    IF rdargs:=ReadArgs('FILE_1/A,FILE_2/A',myargs,NIL)
  21.    ELSE
  22.       error(ER_SYNTAX)
  23.    ENDIF
  24.    load()
  25.    WriteF('Comparing \e[1m\s\e[0m with \e[1m\s\e[0m.\n',myargs[0],myargs[1]) 
  26.    IF flen1<>flen2
  27.       WriteF('\e[1mFiles not of same length.\e[0m (Resp. \d and \d bytes long)\n',flen1,flen2)
  28.       WriteF('Operating on ')
  29.       IF flen1<flen2
  30.          WriteF('\d',flen1)
  31.          ELSE
  32.          WriteF('\d',flen2)
  33.       ENDIF
  34.       WriteF(' lowest bytes.\n')
  35.    ENDIF
  36.    diff()
  37.    perc:=Mul(result,100)           /* 32-bit multiplication */
  38.    perc:=Div(perc,min)
  39.    WriteF('Difference in bytes   : \e[1m\d / \d\e[0m\n',result,min)
  40.    WriteF('Difference in percent : \e[1m\d %\e[0m\n',perc)
  41.    error(ER_NONE)
  42. ENDPROC
  43.  
  44. PROC load()
  45.    flen1:=FileLength(myargs[0])
  46.    handle1:=Open(myargs[0],OLDFILE)
  47.    IF (flen1<1) OR (handle1=NIL) THEN error(ER_FILE1)
  48.    flen2:=FileLength(myargs[1])
  49.    handle2:=Open(myargs[1],OLDFILE)
  50.    IF (flen2<1) OR (handle2=NIL) THEN error(ER_FILE2)
  51.    MOVE.L flen1,D6        /* get smallest filelength */
  52.    MOVE.L flen2,D7
  53.    CMP.L  D6,D7
  54.    BLS    noswap
  55.    EXG.L  D6,D7           /* exchange filelengths */
  56. noswap:
  57.    MOVE.L D7,min          /* min = smallest length */
  58.    buf1:=New(min)
  59.    IF buf1=NIL THEN error(ER_MEM)
  60.    buf2:=New(min)
  61.    IF buf2=NIL THEN error(ER_MEM)
  62.    IF Read(handle1,buf1,min)<>min THEN error(ER_FILE1)
  63.    Close(handle1)
  64.    handle1:=NIL
  65.    IF Read(handle2,buf2,min)<>min THEN error(ER_FILE2)
  66.    Close(handle2)
  67.    handle2:=NIL
  68. ENDPROC
  69.  
  70. PROC diff()
  71.    MOVE.L buf1,A0         /* adress of file1 in memory */
  72.    MOVE.L buf2,A1         /* adress of file2 in memory */
  73.    FOR i:=1 TO min
  74.       MOVE.B (A0)+,D4
  75.       MOVE.B (A1)+,D5
  76.       CMP.B  D4,D5
  77.       BEQ    equal
  78.       result:=result+1
  79.    equal:
  80.    ENDFOR
  81. ENDPROC
  82.  
  83. PROC error(nr)
  84.   IF handle1 THEN Close(handle1)
  85.   IF handle2 THEN Close(handle2)
  86.   SELECT nr
  87.      CASE ER_FILE1;   WriteF('Could not read \e[1m\s\e[0m\n',myargs[0])
  88.      CASE ER_FILE2;   WriteF('Could not read \e[1m\s\e[0m\n',myargs[1])
  89.      CASE ER_MEM;     WriteF('No memory to load files!\n')
  90.      CASE ER_SYNTAX;  WriteF('Syntax error\n')
  91.      CASE ER_NONE;
  92.   ENDSELECT
  93.   FreeArgs(rdargs)
  94.   CleanUp(0)
  95. ENDPROC
  96.